home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 2.2 / Form-shrinkBy.st < prev    next >
Text File  |  1993-07-24  |  5KB  |  154 lines

  1. "    NAME        Form-shrinkBy
  2.     AUTHOR        Dr Who
  3.     FUNCTION see Form-features
  4.     ST-VERSIONS    
  5.     PREREQUISITES     
  6.     CONFLICTS    
  7.     DISTRIBUTION      world
  8.     VERSION        1.1
  9.     DATE    22 Jan 1989"
  10. 'From Smalltalk-80, version 2, of April 1, 1983 on 3 January 1987 at 7:42:45 pm'!
  11.  
  12.  
  13.  
  14. !Form methodsFor: 'image manipulation'!
  15.  
  16. shrinkBy2
  17.     "Answers with a copy of the receiver, scaled down by 2 in each direction.
  18.      The 4 bits corresponding to each bit in the new form are summed,
  19.      returning a value in the range 0 to 4.  The resulting
  20.      bit is set to black (1) if 2 or more bits are set, otherwise it is set
  21.      to white (0).  For performance reasons, the arithmetic is done with
  22.      BitBlt operations.  This special method uses a better algorithm than the
  23.      general shrinkBy: method."
  24.  
  25.     "To see the improvement this method has over the general one,
  26.      evaluate the following expressions."
  27.     "
  28.     | tempForm |
  29.     Display white.
  30.     tempForm _
  31.         Form readFrom: '/usr/r3/appl/PS/goodies/Manchester_goodies/Astronaut.form'.
  32.     tempForm displayAt: Display boundingBox topCenter.
  33.     tempForm shrinkBy2 displayAt: Display boundingBox topLeft.
  34.     (tempForm shrinkBy: 2@2) displayAt: Display boundingBox leftCenter.
  35.     Sensor waitButton.
  36.     ScheduledControllers restore.
  37.     "
  38.  
  39.     | nbr1 nbr2 nbr4 carry2 carry4 all delta
  40.       wideForm shrunkenForm saveOffset |
  41.  
  42.     nbr1 _ Form extent: self extent.
  43.     nbr2 _ Form extent: self extent.
  44.     nbr4 _ Form extent: self extent.
  45.     carry2 _ Form extent: self extent.
  46.     carry4 _ Form extent: self extent.
  47.     all _ self boundingBox.
  48.     1 to: 4 do:
  49.         [:i |
  50.         delta _ ((#(0 1 1 0) at: i) @ (#(0 0 1 1) at: i)).
  51.  
  52.         carry2 copy: all from: 0@0 in: nbr1 rule: 3.
  53.         carry2 copy: all from: delta in: self rule: 1.  "AND for carry into 2"
  54.         nbr1 copy: all from: delta in: self rule: 6.     "XOR for sum 1"
  55.  
  56.         carry4 copy: all from: 0@0 in: nbr2 rule: 3.
  57.         carry4 copy: all from: 0@0 in: carry2 rule: 1. "AND for carry into 4"
  58.         nbr2 copy: all from: 0@0 in: carry2 rule: 6.   "XOR for sum 2"
  59.  
  60.         nbr4 copy: all from: 0@0 in: carry4 rule: 6   "XOR for sum 4 (ignore carry)"
  61.     ].
  62.     nbr4 copy: all from: 0@0 in: nbr2 rule: 7.         "OR top 2 bits."
  63.  
  64.     saveOffset _ self offset.
  65.     self offset: 0 @ 0.
  66.     wideForm _ Form new extent: self width @ (self height // 2).
  67.     0 to: wideForm height - 1 do: 
  68.         [:index | 
  69.         wideForm copy: (0 @ index extent: wideForm width @ 1)
  70.             from: 0 @ (index * 2)
  71.             in: nbr4
  72.             rule: Form over].
  73.     shrunkenForm _ Form new extent: (self width // 2) @ wideForm height.
  74.     0 to: shrunkenForm width - 1 do: 
  75.         [:index | 
  76.         shrunkenForm
  77.             copy: (index @ 0 extent: 1 @ wideForm height)
  78.             from: (index * 2) @ 0
  79.             in: wideForm
  80.             rule: Form over].
  81.     self offset: saveOffset.
  82.     shrunkenForm offset: (offset // 2).
  83.     ^shrunkenForm! !'From Smalltalk-80, version 2, of April 1, 1983 on 3 January 1987 at 7:42:55 pm'!
  84.  
  85.  
  86.  
  87. !Form methodsFor: 'image manipulation'!
  88.  
  89. shrinkBy3
  90.     "Answers with a copy of the receiver, scaled down by 3 in each direction.
  91.      The 4 bits corresponding to each bit in the new form are summed,
  92.      returning a value in the range 0 to 9.  The resulting
  93.      bit is set to black (1) if 5 or more bits are set, otherwise it is set
  94.      to white (0).  For performance reasons, the arithmetic is done with
  95.      BitBlt operations.  This special method uses a better algorithm than the
  96.      general shrinkBy: method."
  97.  
  98.     "Form fromUser shrinkBy3 display."
  99.  
  100.     | nbr1 nbr2 nbr4 nbr8 br2 br4 br8
  101.      carry2 carry4 carry8 all delta wideForm shrunkenForm saveOffset |
  102.  
  103.     nbr1 _ Form extent: self extent.
  104.     nbr2 _ Form extent: self extent.
  105.     nbr4 _ Form extent: self extent.
  106.     nbr8 _ Form extent: self extent.
  107.     carry2 _ Form extent: self extent.
  108.     carry4 _ Form extent: self extent.
  109.     carry8 _ Form extent: self extent.
  110.     all _ self boundingBox.
  111.     1 to: 9 do:
  112.         [:i |
  113.          "delta is the offset of the eight neighboring cells, plus self."
  114.         delta _  
  115.             ((#(-1 0 1 1 1 0 -1 -1 0) at: i) @ (#(-1 -1 -1 0 1 1 1 0 0) at: i)).
  116.         carry2 copy: all from: 0@0 in: nbr1 rule: 3.
  117.         carry2 copy: all from: delta in: self rule: 1.  "AND for carry into 2"
  118.         nbr1 copy: all from: delta in: self rule: 6.     "XOR for sum 1"
  119.  
  120.         carry4 copy: all from: 0@0 in: nbr2 rule: 3.
  121.         carry4 copy: all from: 0@0 in: carry2 rule: 1. "AND for carry into 4"
  122.         nbr2 copy: all from: 0@0 in: carry2 rule: 6.    "XOR for sum 2"
  123.  
  124.         carry8 copy: all from: 0@0 in: nbr4 rule: 3.
  125.         carry8 copy: all from: 0@0 in: carry4 rule: 1. "AND for carry into 8"
  126.         nbr4 copy: all from: 0@0 in: carry4 rule: 6.    "XOR for sum 4"
  127.  
  128.         nbr8 copy: all from: 0@0 in: carry8 rule: 6].   "XOR for sum 8 (ignore carry)"
  129.  
  130.     nbr2 copy: all from: 0@0 in: nbr1 rule: 7.
  131.     nbr4 copy: all from: 0@0 in: nbr2 rule: 1.
  132.     nbr8 copy: all from: 0@0 in: nbr4 rule: 7.
  133.         "Logic is nbr8 OR (nbr4 AND (nbr2 OR nbr1))."
  134.     saveOffset _ self offset.
  135.     self offset: 0 @ 0.
  136.     wideForm _ Form new extent: self width @ (self height // 3).
  137.     0 to: wideForm height - 1 do: 
  138.         [:index | 
  139.         wideForm copy: (0 @ index extent: wideForm width @ 1)
  140.             from: 0 @ (index * 3)
  141.             in: nbr8
  142.             rule: Form over].
  143.     shrunkenForm _ Form new extent: (self width // 3) @ wideForm height.
  144.     0 to: shrunkenForm width - 1 do: 
  145.         [:index | 
  146.         shrunkenForm
  147.             copy: (index @ 0 extent: 1 @ wideForm height)
  148.             from: (index * 3) @ 0
  149.             in: wideForm
  150.             rule: Form over].
  151.     self offset: saveOffset.
  152.     shrunkenForm offset: (offset // 3).
  153.     ^shrunkenForm! !
  154.